home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Gekkan Dennou Club 147
/
Gekkan Dennou Club - 2000.8 Vol. 147 (Japan).7z
/
Gekkan Dennou Club - 2000.8 Vol. 147 (Japan) (Track 1).bin
/
docs
/
ippon
/
ver
/
006
/
shot.c
< prev
next >
Wrap
C/C++ Source or Header
|
2000-07-07
|
2KB
|
99 lines
/* shot.c */
#include <xsp2lib.h>
#include "main.h"
#include "player.h"
#include "shot.h"
#ifndef NULL
#define NULL ((void *) 0)
#endif
#define SHOT_MAX 1 /* ショット最大数 */
static SHOT shot[SHOT_MAX]; /* ワーク */
#define PALET_SHOT 0x0800
#define SHOT_SPEED 31
/* ゲーム開始時に呼ばれる */
void ShotInit (void)
{
int i;
/* リストをつなげる */
shot_top = NULL;
shot_null_top = shot;
for (i = 0; i < SHOT_MAX; i++)
shot[i].next = &shot[i + 1];
shot[SHOT_MAX - 1].next = NULL;
}
/* ショット出現時に呼ばれる */
void ShotAlloc (void)
{
SHOT *p;
if (shot_null_top == NULL) /* ワークの空きはあるか? */
return;
p = shot_null_top;
shot_null_top = p->next;
p->next = shot_top;
shot_top = p;
p->lx = (player->x) << 16; /* ショットの座標は自機+(0,-16) */
p->ly = (player->y + 4) << 16; /* 自機の少し上に出す */
p->pt = obj_shot;
p->info = PALET_SHOT | PRIORITY_SHOT;
p->damage = 0;
p->vx = xytable[SHOT_SPEED][192].x;
p->vy = xytable[SHOT_SPEED][192].y;
}
/* 垂直同期ごとに呼ばれる */
void ShotMove (void)
{
SHOT *p, *q;
p = shot_top; /* 現在注目しているワーク */
q = NULL; /* 1つ前のワーク(ワーク削除時に必要) */
while (p != NULL) {
/* 速度を足して上位ワード(固定整数部)だけ取り出す */
p->x = (p->lx += p->vx) >> 16;
p->y = (p->ly += p->vy) >> 16;
/* ショットが敵に当たった又は画面外に出たか? */
/* (画面右から出た判定と左から出た判定を1回の比較で行っている事に注目) */
if ((p->damage)
|| ((unsigned short) (p->x) > 256 + 16)
|| ((unsigned short) (p->y) > 256 + 16)) {
if (q == NULL) { /* リストの一番最初を削除 */
shot_top = p->next;
p->next = shot_null_top;
shot_null_top = p;
q = NULL;
p = shot_top;
} else {
q->next = p->next;
p->next = shot_null_top;
shot_null_top = p;
p = q->next;
}
} else {
xobj_set_st (p);
q = p;
p = p->next;
}
}
}